技巧30 检查容器
尽管Docker命令可以让用户访问容器和镜像的基本信息,但是有时候用户还是想进一步了解这些Docker对象的内部元数据。
问题
想要找出一个容器的IP地址。
解决方案
使用 docker inspect
命令。 docker inspect
命令可以让用户以JSON格式访问Docker的内部元数据,包括容器的IP地址。该命令会产出一大段输出,因此这里只展示了镜像元数据的一个简短摘要,如代码清单5-3所示。
代码清单5-3 一个镜像的原始inspect输出
$ docker inspect ubuntu | head
[{
"Architecture": "amd64",
"Author": "",
"Comment": "",
"Config": {
"AttachStderr": false,
"AttachStdin": false,
"AttachStdout": false,
"Cmd": [
"/bin/bash"
$
用户可以按名称或ID来检索镜像和容器。它们两者的元数据会有所不同。例如,容器将具有镜像缺乏(一个镜像是无状态的)的运行时字段,如“State”。
在这个例子里,用户想要找出宿主机上一个容器的IP地址。为了实现这一点,可以使用 docker inspect
命令然后带上 format
标志,如代码清单5-4所示。
代码清单5-4 定位一个容器的IP地址
docker inspect \ ⇽--- docker inspect命令
--format '{{.NetworkSettings.IPAddress}}' \ ⇽--- format标志。它会使用Go模板(不在讨论范围)来格式化输出。这里,它会从inspect输出结果里的NetworkSettings字段里取出IPAddress字段的值
0808ef13d450 ⇽--- 想要检查的那一项Docker容器的ID
这一技巧可以用于自动化,因为这个接口的输出内容可能比其他Docker命令更准确。代码清单5-5所示的命令给出所有正在运行的容器的IP地址并对它们执行ping操作。
代码清单5-5 获取正在运行的容器的IP地址并对返回的列表逐一做ping
$ docker ps -q | \ ⇽--- 获取所有正在运行的容器的ID
xargs docker inspect --format='{{.NetworkSettings.IPAddress}}' | \ ⇽--- 针对所有容器ID再次执行inspect命令来获取它们的IP地址
xargs -l1 ping -c1 ⇽--- 取出每个IP地址然后逐一做ping
PING 172.17.0.5 (172.17.0.5) 56(84) bytes of data.
64 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.095 ms
--- 172.17.0.5 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.095/0.095/0.095/0.000 ms
注意,由于 ping
只接受一个IP地址参数,我们必须给 xargs
传入一个附加参数,告诉它针对每行内容单独执行该命令。
提示
如果用户没有正在运行的容器,不妨执行这条命令运行一个容器: docker run -d ubuntu sleep 1000
。
讨论
在调试容器为什么不工作的时候,技巧47中检索容器和跳转到容器里的办法可能是工具箱里面最重要的两个工具。当用户认为已经启动了一个以特定的方式配置好的容器,但是它却表现得不那么符合预期时,就轮到inspect闪亮登场了——第一步应当是检查容器,撇开其他事情先不说,先验证Docker实际分配的容器端口和卷的映射是否如预期那样。